package com.linzp.bishe.utils;

import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * @ClassName DealFile
 * @Description 处理文件
 * @Author LinZePeng
 * @Date 2022/1/20 12:14
 * @Version 1.0
 */
public class DealFile {

	/**
	 * @return void
	 * @Description 更新文件夹中的文件
	 * @Param [file, savePath]
	 */
	public static String upDateMultipartFile(MultipartFile file, String savePath,String fileName) {
		File targetPath = new File(savePath);
		//如果目录不存在生成目录
		if (!targetPath.exists()) targetPath.mkdirs();
		String subName = fileName.substring(0,fileName.lastIndexOf("."));

		DeleteFolder(savePath+"/"+fileName);
		String originalFilename = file.getOriginalFilename();
		String suffix= originalFilename.substring(originalFilename.lastIndexOf("."));
		String name = subName+suffix;
		File targetFileName = new File(targetPath, name);
		try {
			file.transferTo(targetFileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return name;
	}

	/**
	 * @return java.lang.String
	 * @Description 将文件保存到缓存中
	 * @Param [file, savePath]
	 */
	public static String saveMultipartFile(MultipartFile file, String savePath) {
		//上传文件本来的地址 例如 a.jpg
		String originalFilename = file.getOriginalFilename();
		//拿到后缀.jpg
		String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
		//生成的唯一文件名
		String newFilename = UUID.randomUUID().toString() + substring;
//		//生成日期目录
//		SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
//		String datePath = format.format(new Date());

		File targetPath = new File(savePath);
		//如果目录不存在生成目录
		if (!targetPath.exists()) targetPath.mkdirs();

		File targetFileName = new File(targetPath, newFilename);

		try {
			file.transferTo(targetFileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return newFilename;
	}

	/**
	 * @return void
	 * @Description 将缓存中的文件转义到特定的目标里
	 * @Param [cache, savePath]
	 */
	public static void saveCacheToFile(String cache, String savePath, String name) {
		File cacheFile = new File(cache);
		if (!cacheFile.exists()) cacheFile.mkdirs();//如果目录不存在生成目录
		File saveFile = new File(savePath);
		if (!saveFile.exists()) saveFile.mkdirs();//如果目录不存在生成目录
		BufferedOutputStream saveStream = null;
		BufferedInputStream cacheStream = null;
		try {
			saveStream = new BufferedOutputStream(new FileOutputStream(new File(saveFile, name)));
			cacheStream = new BufferedInputStream(new FileInputStream(new File(cacheFile, name)));
			byte[] b = new byte[1024];
			int len = -1;
			while ((len = cacheStream.read(b)) != -1) {
				saveStream.write(b, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (saveStream != null) {
				try {
					saveStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (cacheStream != null) {
				try {
					cacheStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 根据路径删除指定的目录或文件，无论存在与否
	 *
	 * @param sPath 要删除的目录或文件
	 * @return 删除成功返回 true，否则返回 false。
	 */
	public static boolean DeleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) {  // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) {  // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else {  // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除单个文件
	 *
	 * @param sPath 被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	private static boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 删除目录（文件夹）以及目录下的文件
	 *
	 * @param sPath 被删除目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	private static boolean deleteDirectory(String sPath) {
		//如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		//如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		//删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			//删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag) break;
			} //删除子目录
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag) break;
			}
		}
		if (!flag) return false;
		//删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

}
